import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.utils.clearInterval;
import flash.utils.clearTimeout;
import flash.utils.setInterval;
import flash.utils.setTimeout;

import juego.Barco;

import mx.controls.Label;

private const MOVIMIENTO_EN_PIXELES_Y:int = 15;
private const MOVIMIENTO_EN_PIXELES_X:int = 15;
private var xTo:Number = 0;
private var yTo:Number = 0;
private var timer:uint;

private function desplazarPantalla(_event: KeyboardEvent): void {
	switch (_event.keyCode) {
		case Keyboard.A:
			desplazarPantallaIzquierda();
		break;
		case Keyboard.D:
			desplazarPantallaDerecha();
		break;
		case Keyboard.W:
			desplazarPantallaArriba();
		break;
		case Keyboard.S:
			desplazarPantallaAbajo();
		break;
		case Keyboard.NUMBER_1:
			//Torpedo
			cambiarAccion(PREFIJO_ARMA+"_"+TIPO_TORPEDO);
		break;
		case Keyboard.NUMBER_2:
			//Artilleria 1
			cambiarAccion(PREFIJO_ARMA+"_"+TIPO_ARTILLERIA_PROA);
		break;
		case Keyboard.NUMBER_3:
			//Artilleria 2
			cambiarAccion(PREFIJO_ARMA+"_"+TIPO_ARTILLERIA_POPA);
		break;
		case Keyboard.Q:
			cambiarAccion(ACC_MOVER);
		break;
		case Keyboard.E:
			cambiarAccion(ACC_VIRAR);
		break;
		case Keyboard.SPACE:
			cambiarBarco();
		break;
		default:
			_event.stopPropagation();
		break;
	}
}

private function desplazarPantallaIzquierda(): void {
	if (pantalla.getXPantalla() > 0) {
		pantalla.setXPantalla(Math.max(0, pantalla.getXPantalla() - MOVIMIENTO_EN_PIXELES_X));
		cnvFondo.x =  Math.min(0, cnvFondo.x + MOVIMIENTO_EN_PIXELES_X);
		cnvElementosMapa.x = cnvFondo.x;
		cnv12Millas.x = cnvFondo.x;
		cnvBarcos.x = cnvFondo.x;
	}
}

private function desplazarPantallaDerecha(): void {
	if (pantalla.getXPantalla() + pantalla.getAnchoPantalla() < pantalla.getAnchoEscenario()) {
		pantalla.setXPantalla(Math.min( pantalla.getAnchoEscenario() - pantalla.getAnchoPantalla() , pantalla.getXPantalla() + MOVIMIENTO_EN_PIXELES_X));
		cnvFondo.x =  Math.max(pantalla.getAnchoPantalla() - pantalla.getAnchoEscenario() + MOVIMIENTO_EN_PIXELES_X, cnvFondo.x - MOVIMIENTO_EN_PIXELES_X);
		cnvElementosMapa.x = cnvFondo.x;
		cnv12Millas.x = cnvFondo.x;
		cnvBarcos.x = cnvFondo.x;
	}
}

private function desplazarPantallaArriba(): void {
	if (pantalla.getYPantalla() > 0) {
		pantalla.setYPantalla(Math.max(0, pantalla.getYPantalla() - MOVIMIENTO_EN_PIXELES_Y));
		cnvFondo.y = Math.min(0, cnvFondo.y + MOVIMIENTO_EN_PIXELES_Y);
		cnvElementosMapa.y = cnvFondo.y;
		cnv12Millas.y = cnvFondo.y;
		cnvBarcos.y = cnvFondo.y;
	}
}

private function desplazarPantallaAbajo(): void {
	if (pantalla.getYPantalla() + pantalla.getAltoPantalla() < pantalla.getAltoEscenario()) {
		pantalla.setYPantalla(Math.min(pantalla.getAltoEscenario()-pantalla.getAltoPantalla(), pantalla.getYPantalla() + MOVIMIENTO_EN_PIXELES_Y));
		cnvFondo.y = Math.max(pantalla.getAltoPantalla() - pantalla.getAltoEscenario() + MOVIMIENTO_EN_PIXELES_Y, cnvFondo.y-MOVIMIENTO_EN_PIXELES_Y);
		cnvElementosMapa.y = cnvFondo.y;
		cnv12Millas.y = cnvFondo.y;
		cnvBarcos.y = cnvFondo.y;
	}
}

private function desplazarPantallaTo( _xPos:Number, _yPos:Number ): void {
	//trace ("Alto escenario " + pantalla.getAltoPantalla() + " Ancho escenario " + pantalla.getAnchoPantalla());
	var newX:Number = Math.min(Math.max( _xPos - (pantalla.getAnchoPantalla() / 2), 0 ), (pantalla.getAnchoEscenario()-pantalla.getAnchoPantalla()) );
	var newY:Number = Math.min(Math.max( _yPos - (pantalla.getAltoPantalla() / 2), 0 ), (pantalla.getAltoEscenario()-pantalla.getAltoPantalla()) );

	if ( pantalla.getXPantalla() != newX || pantalla.getYPantalla() != newY ) {
		xTo = newX - pantalla.getXPantalla();
		yTo = newY - pantalla.getYPantalla();
		//trace ("Antes de mover: xTo = " + xTo + " yTo = " + yTo);
		desplazandoPantalla = true;
	}
}

private function desplazarPantallaAux(): void {
	if ( xTo != 0 ) {
		var x:Number = Math.abs(xTo) - MOVIMIENTO_EN_PIXELES_X;
		if ( x > 0 ) {
			x = MOVIMIENTO_EN_PIXELES_X * (xTo/Math.abs(xTo));
		} else {
			x = xTo;
		}
		pantalla.setXPantalla(pantalla.getXPantalla() + x);
		cnvFondo.x += x * -1
		cnvElementosMapa.x = cnvFondo.x;
		cnv12Millas.x = cnvFondo.x;
		cnvBarcos.x = cnvFondo.x;
		xTo += x * -1;
	}
	if ( yTo != 0 ) {
		var y:Number = Math.abs(yTo) - MOVIMIENTO_EN_PIXELES_Y;
		if ( y > 0 ) {
			y = MOVIMIENTO_EN_PIXELES_Y * ( yTo/Math.abs(yTo));
		} else {
			y = yTo;
		}
		
		pantalla.setYPantalla(pantalla.getYPantalla() + y);
		cnvFondo.y += y * -1
		cnvElementosMapa.y = cnvFondo.y;
		cnv12Millas.y = cnvFondo.y;
		cnvBarcos.y = cnvFondo.y;
		yTo += y * -1;
	}
	if ( xTo == 0 && yTo == 0 ) desplazandoPantalla = false;
}

private function ocultarBotonera(_event: MouseEvent): void {
	_event.stopPropagation();
	movBotonera.end();
	movBotonera.xTo = -cnvBotones.width;
	movBotonera.play();
	imgMostrarBotonera.visible = true;
	imgOcultarBotonera.visible = false;
	cnvControlVistaBotonera.x = 10;
}

private function mostrarBotonera(_event: MouseEvent): void {
	_event.stopPropagation();
	movBotonera.end();
	movBotonera.xTo = 0;
	movBotonera.play();
	imgMostrarBotonera.visible = false;
	imgOcultarBotonera.visible = true;
	cnvControlVistaBotonera.x = cnvBotones.width;
}

private function ocultarVistaLateral(_event: MouseEvent): void {
	_event.stopPropagation();
	movVistaLateral.end();
	movVistaLateral.xTo = pantalla.getAnchoPantalla();
	movVistaLateral.play();
	imgMostrarVistaLateral.visible = true;
	imgOcultarVistaLateral.visible = false;
	cnvControlVistaLateral.x = pantalla.getAnchoPantalla()-30;
}

private function mostrarVistaLateral(_event: MouseEvent): void {
	_event.stopPropagation();
	movVistaLateral.end();
	movVistaLateral.xTo = pantalla.getAnchoPantalla() - cnvVistaLateral.width;
	movVistaLateral.play();
	imgMostrarVistaLateral.visible = false;
	imgOcultarVistaLateral.visible = true;
	cnvControlVistaLateral.x = pantalla.getAnchoPantalla() - cnvVistaLateral.width - cnvControlVistaLateral.width;
	
}

private function agregarLabelEnemigo(_nombre: String, _bando: String, _vida: String, _index: Number): void {
	var tmpLabel: Label = new Label();
	tmpLabel.text = _nombre;
	switch (_bando) {
		case BANDO_ROJO:
			tmpLabel.setStyle("color", "#FF0000");
		break;
		case BANDO_AZUL:
			tmpLabel.setStyle("color", "#0000FF");
		break;
		case BANDO_VERDE:
			tmpLabel.setStyle("color", "#00FF00");
		break;
	}
	tmpLabel.setStyle("font-weight", "bold");
	tmpLabel.setStyle("font-size", 10);
	tmpLabel.x = 3;
	tmpLabel.height = 16;
	
	//trace("Y del label de titulo: " + (tmpLabel.height * 2 * _index + 3));
	tmpLabel.y = tmpLabel.height * 2 * _index.valueOf() + 3;
	cnvEstadisticasEnemigos.addChild(tmpLabel);
		
	tmpLabel = new Label();
	tmpLabel.text = _vida;
	tmpLabel.setStyle("color", "#333333");
	tmpLabel.setStyle("font-weight", "bold");
	tmpLabel.setStyle("font-size", 10);
	tmpLabel.x = 8;
	tmpLabel.height = 16;
	//trace("Y del label de puntos: " + (tmpLabel.height * 2 * _index + 3 + tmpLabel.height));
	tmpLabel.y = tmpLabel.height * 2 * _index.valueOf() + 3 + tmpLabel.height;
	cnvEstadisticasEnemigos.addChild(tmpLabel);
}

private function actualizarInfoBarcoSeleccionado(): void {
	if ( barcos[seleccionado] is Barco ) {
		lblBlindaje.text = (barcos[seleccionado] as Barco).getBlindaje().toString();
		lblVelocidad.text = (barcos[seleccionado] as Barco).getTimePixel().toString();
		lblVida.text = (barcos[seleccionado] as Barco).getVida().toString();
		actualizarDatosArmas();
	}
}

private function actualizarDatosArmas(): void {
	lblMuniciones1.text = barcos[seleccionado].getArma(1);
	lblMuniciones2.text = barcos[seleccionado].getArma(2);
	lblMuniciones3.text = barcos[seleccionado].getArma(3);
}

private function mostrarOpcionesReparacion(_idPuerto: String, _idBarco: String): void {
	//trace("Mostramos opciones de reparación. Barco: " + _idBarco);
	var respuestaRepararArma: Function = function (_ev:MouseEvent): void {
		_ev.stopPropagation();
		ws.repararEnPuerto(idPartida, _idPuerto, _idBarco, "ARMA");
		cnvOpcionesReparacion.visible = false;
		//trace("Reparamos las armas de : " + _idBarco);
	};
	btnRepararArmas.removeEventListener(MouseEvent.CLICK, respuestaRepararArma);
	btnRepararArmas.addEventListener(MouseEvent.CLICK, respuestaRepararArma);
	
	var respuestaRepararBlindaje: Function = function (_ev:MouseEvent): void {
		_ev.stopPropagation();
		ws.repararEnPuerto(idPartida, _idPuerto, _idBarco, "BLINDAJE");
		cnvOpcionesReparacion.visible = false;
		//trace("Reparamos el blindaje de : " + _idBarco);
	};
	btnRepararBlindaje.removeEventListener(MouseEvent.CLICK, respuestaRepararBlindaje);
	btnRepararBlindaje.addEventListener(MouseEvent.CLICK, respuestaRepararBlindaje);
	
	var respuestaRepararVelocidad: Function = function (_ev:MouseEvent): void {
		_ev.stopPropagation();
		ws.repararEnPuerto(idPartida, _idPuerto, _idBarco, "VELOCIDAD");
		cnvOpcionesReparacion.visible = false;
		//trace("Reparamos la velocidad de : " + _idBarco);
	};
	btnRepararVelocidad.removeEventListener(MouseEvent.CLICK, respuestaRepararVelocidad);
	btnRepararVelocidad.addEventListener(MouseEvent.CLICK, respuestaRepararVelocidad);
	
	cnvOpcionesReparacion.visible = true;
}

private function setearTextos(): void {
	lblNombreCapitan.text = new String(jugadores[bando]);
	lblTituloBlindaje.text = textos['blindaje'];
	lblTituloVelocidad.text = textos['velocidad'];
	lblTituloVida.text = textos['vida'];
	imgBtnMover.toolTip = textos['mover'];
	imgBtnDisparar.toolTip = textos['disparar'];
	imgBtnVirar.toolTip = textos['virar'];
	imgBtnBarco.toolTip = textos['cambiarBarco'];
	imgBtnTorpedo.toolTip = textos['torpedo'];
	imgBtnArtilleria1.toolTip = textos['artilleria1'];
	imgBtnArtilleria2.toolTip = textos['artilleria2'];
	lblRepararEnPuerto.text = textos['repararEnPuerto'];
	btnRepararArmas.label = textos['artilleria'];
	btnRepararVelocidad.label = textos['velocidad'];
	btnRepararBlindaje.label = textos['blindaje'];
}